/*
 * @Author: your name
 * @Date: 2021-04-17 18:35:27
 * @LastEditTime: 2021-04-28 21:32:17
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \junior-lessons_second-term\EmbeddedSystem\Experiment\实验6 独立看门狗实验\exti\exti-v4.1.c
 */
#include "exti.h"
#include "delay.h" 
#include "led.h" 
#include "key.h"
#include "beep.h"
//////////////////////////////////////////////////////////////////////////////////     
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK STM32F407开发板
//外部中断 驱动代码       
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2014/5/4
//版本：V1.0
//版权所有，盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                      
////////////////////////////////////////////////////////////////////////////////// 

int flag=0;     // 喂狗标志

// 外部中断3服务程序(KEY1, 下键-喂狗)
void EXTI3_IRQHandler(void){
    delay_ms(100);            // 消抖-10ms不太够,100ms差不多
    if(KEY1==0){
        IWDG_Feed();        // 喂狗
        BEEP=0;             // 解除蜂鸣器报警
        LED0=1;             // 解除LED0闪烁
        flag=1;             // 喂狗标记置1-表示已喂狗
    }         
    EXTI_ClearITPendingBit(EXTI_Line3);  // 清除LINE3上的中断标志位  
}

// 外部中断0服务程序(WK_UP, 上键-无功能)
void EXTI0_IRQHandler(void){
    delay_ms(100);        // 消抖-10ms不太够,100ms差不多
    if(WK_UP==1){
        // do nothing
    }         
    EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位 
}    

// 外部中断2服务程序(KEY2, 左键-无功能)
void EXTI2_IRQHandler(void){
    delay_ms(100);    //消抖
    if(KEY2==0){                 
        LED0=!LED0; 
    }         
    EXTI_ClearITPendingBit(EXTI_Line2);//清除LINE2上的中断标志位 
}

// 外部中断4服务程序(KEY0, 右键-无功能)
void EXTI4_IRQHandler(void)
{
    delay_ms(100);    //消抖
    if(KEY0==0){                 
        // do nothing
    }         
    EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位  
}
       
//外部中断初始化程序
//初始化PE2~4,PA0为中断输入.
void EXTIX_Init(void){
    NVIC_InitTypeDef   NVIC_InitStructure;
    EXTI_InitTypeDef   EXTI_InitStructure;
    
    KEY_Init();     // 按键对应的IO口初始化
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  // 使能SYSCFG时钟
    
 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);   // PE2 连接到中断线2
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);   // PE3 连接到中断线3
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);   // PE4 连接到中断线4
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);   // PA0 连接到中断线0
    
    /* 配置EXTI_Line0 */
    EXTI_InitStructure.EXTI_Line = EXTI_Line0;              // LINE0
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;     // 中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  // 上升沿触发 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;               // 使能LINE0
    EXTI_Init(&EXTI_InitStructure);                         // 配置
        
    /* 配置EXTI_Line2,3,4 */
    EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line4;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;         // 中断事件
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;     // 下降沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;                   // 中断线使能
    EXTI_Init(&EXTI_InitStructure);                             // 配置
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                // 外部中断0
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;    // 抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;           // 子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 // 使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);                                 // 配置
        
    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;                // 外部中断2
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;    // 抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;           // 子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 // 使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);                                 // 配置
        
        
    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;                // 外部中断3
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;    // 抢占优先级2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;           // 子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 // 使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);                                 // 配置
        
        
    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;                // 外部中断4
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;    // 抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;           // 子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                 // 使能外部中断通道
    NVIC_Init(&NVIC_InitStructure);                                 // 配置
       
}












